/*
 * DBProdotto
 * 
 * Class that will take care of operations on the DB Product
 * 
 * author Luigi di Martino , Carmine Colicino
 * 
 * version 1.0
 */

package it.unisa.udocs.storage;

import it.unisa.udocs.commons.DBConnectionPool;
import it.unisa.udocs.commons.DBNames;
import it.unisa.udocs.data.*;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;

import com.mysql.jdbc.Statement;





public class DBProdotto {
	
	private static DBProdotto dbProdotto;
	
	/**
	 * Method that implements the Singleton Design Pattern
	 * 
	 * @return DBProdotto
	 * 
	 */
	public static DBProdotto getInstance() {
		if (dbProdotto == null)
			dbProdotto = new DBProdotto();
		return dbProdotto;
	}


	/**
	 * Is used to search for all Products of a specific researcher
	 * 
	 * @param id_account - The Id of the researcher's account
	 * 
	 *  @return An Array containing All researcher's products 
	 * 
	 */
	public ArrayList<Prodotto> getProdottiById(int id_account) {
		
		//Istanzia un oggetto prodotto
		Prodotto prod = null;
				
		//Istanzia un ArrayList di Prodotti
		ArrayList<Prodotto> listaProdottiPersonali = new ArrayList<Prodotto>();
				
		try {
			//Crea una connessione al DB
			Connection con = DBConnectionPool.getConnection();
			
			//Crea la query di ricerca
			String query = "SELECT * FROM Prodotto WHERE proprietario = '" 
					+ id_account + "'";
			
			Statement st = (Statement) con.createStatement();

			ResultSet rs = st.executeQuery(query);

			while(rs.next())
			{
				prod = new Prodotto(Integer.parseInt(
						rs.getString(DBNames.PROD_ID)), 
						rs.getString(DBNames.PROD_TIT),
						rs.getString(DBNames.PROD_STATO),
						rs.getString(DBNames.PROD_COD),
						rs.getString(DBNames.PROD_PUBB),
						rs.getString(DBNames.PROD_LING),
						rs.getString(DBNames.PROD_ANNO_PUBB),
						rs.getInt(DBNames.PROD_PROPR),
						rs.getString(DBNames.PROD_URL),
						rs.getString(DBNames.PROD_ABSTRACT),
						rs.getString(DBNames.PROD_AUTORI),
						rs.getString(DBNames.PROD_TIP));
				System.out.println("id: "+prod.getId_prodotto() + 
						" pubblico: " + prod.getPubblico());
				listaProdottiPersonali.add(prod);
			}

			System.out.println("List_Product created" );

			st.close();
			rs.close();
			DBConnectionPool.releaseConnection(con);
		} catch (SQLException e) {
			e.printStackTrace();
		}
		
		return listaProdottiPersonali;
	}
	/**
	 * 
	 * Is used to search for a Validated Product Stored in our System
	 * 
	 *@param campiCompilati - An Array containing information about the product what we are searching for 
	 * 
	 *@return An Array containing All Products Found
	 * 
	 */
	public ArrayList<Prodotto> getProdottiRicerca(
			ArrayList<String> campiCompilati){

		//Istanzia un oggetto prodotto
		Prodotto prod = null;
		
		//Istanzia un ArrayList di Prodotti
		ArrayList<Prodotto> listaProdotti = new ArrayList<Prodotto>();
		
		try {
			//Crea una connessione al DB
			Connection con = DBConnectionPool.getConnection();

			//Crea la query di ricerca
			String query = "SELECT * "
					+ "FROM Prodotto JOIN Ricercatore "
					+ "ON Prodotto.proprietario = Ricercatore.ID_account "
					+ "JOIN Dipartimento ON Ricercatore.dipartimento = "
					+ "Dipartimento.ID_dipartimento "
					+ "JOIN Area_scientifica ON Ricercatore.area_scientifica = "
					+ "Area_scientifica.ID_area_scientifica ";

			//variabile di controllo dei campi di ricerca
			boolean valoreInserito = false;


			//Controlla quali campi della ricerca sono stati inseriti e genera la query
			if(campiCompilati.get(0).length() != 0)
			{
				query = query + "WHERE tipologia = '" 
						+ campiCompilati.get(0) + "'";
				valoreInserito = true;
			}
			if(campiCompilati.get(1).length() != 0)
			{
				query += (valoreInserito == true ? " AND " : " WHERE ") 
						+ "anno_pubblicazione = '" + campiCompilati.get(1) + "'";
				valoreInserito = true;
			}
			if(campiCompilati.get(2).length() != 0)
			{
				query += (valoreInserito == true ? " AND " : " WHERE ") 
						+ "titolo like '%" + campiCompilati.get(2) + "%'";
				valoreInserito = true;
			}
			if(campiCompilati.get(3).length() != 0)
			{
				query += (valoreInserito == true ? " AND " : " WHERE ") 
						+ "autori like '%" + campiCompilati.get(3) + "%'";
				valoreInserito = true;
			}
			if(campiCompilati.get(4).length() != 0)
			{
				query += (valoreInserito == true ? " AND " : " WHERE ") 
						+ "autori like '%" + campiCompilati.get(4) + "%'";
				valoreInserito = true;
			}
			if(campiCompilati.get(5).length() != 0)
			{
				query += (valoreInserito == true ? " AND " : " WHERE ") 
						+ "nome_dipartimento = '" + campiCompilati.get(5) + "'";
				valoreInserito = true;
			}
			if(campiCompilati.get(6).length() != 0)
			{
				query += (valoreInserito == true ? " AND " : " WHERE ") 
						+ "nome_area_scientifica = '" + campiCompilati.get(6) 
						+ "'";
				valoreInserito = true;
			}
			
			query += " AND Prodotto.stato = 'validato'";

			System.out.println(query);
			Statement st = (Statement) con.createStatement();

			ResultSet rs = st.executeQuery(query);

			while(rs.next())
			{
				prod = new Prodotto(Integer.parseInt(
						rs.getString(DBNames.PROD_ID)), 
						rs.getString(DBNames.PROD_TIT),
						rs.getString(DBNames.PROD_STATO),
						rs.getString(DBNames.PROD_COD),
						rs.getString(DBNames.PROD_PUBB),
						rs.getString(DBNames.PROD_LING),
						rs.getString(DBNames.PROD_ANNO_PUBB),
						rs.getInt(DBNames.PROD_PROPR),
						rs.getString(DBNames.PROD_URL),
						rs.getString(DBNames.PROD_ABSTRACT),
						rs.getString(DBNames.PROD_AUTORI),
						rs.getString(DBNames.PROD_TIP));
				System.out.println("id: "+prod.getId_prodotto() 
						+ " pubblico: " + prod.getPubblico());
				listaProdotti.add(prod);
			}

			System.out.println("List_Product created" );

			st.close();
			rs.close();
			DBConnectionPool.releaseConnection(con);
		} catch (SQLException e) {
			e.printStackTrace();
		}

		return listaProdotti;
	}
		
	/**
	 * Is used to search for a Product Stored in our System
	 * 
	 * @param campiCompilati - An Array containing information of the product what we are searching for
	 * 
	 *  @return An Array containing All Products Found
	 * 
	 */
	public ArrayList<Prodotto> getProdottiRicercaAdmin(
			ArrayList<String> campiCompilati){

		//Istanzia un oggetto prodotto
		Prodotto prod = null;
		
		//Istanzia un ArrayList di Prodotti
		ArrayList<Prodotto> listaProdotti = new ArrayList<Prodotto>();
		
		try {
			//Crea una connessione al DB
			Connection con = DBConnectionPool.getConnection();

			//Crea la query di ricerca
			String query = "SELECT * "
					+ "FROM Prodotto JOIN Ricercatore "
					+ "ON Prodotto.proprietario = Ricercatore.ID_account "
					+ "JOIN Dipartimento ON Ricercatore.dipartimento = "
					+ "Dipartimento.ID_dipartimento "
					+ "JOIN Area_scientifica ON Ricercatore.area_scientifica = "
					+ "Area_scientifica.ID_area_scientifica ";

			//variabile di controllo dei campi di ricerca
			boolean valoreInserito = false;


			//Controlla quali campi della ricerca sono stati inseriti e genera la query
			if(campiCompilati.get(0).length() != 0)
			{
				query = query + "WHERE tipologia = '" 
						+ campiCompilati.get(0) + "'";
				valoreInserito = true;
			}
			if(campiCompilati.get(1).length() != 0)
			{
				query += (valoreInserito == true ? " AND " : " WHERE ") 
						+ "anno_pubblicazione = '" + campiCompilati.get(1) 
						+ "'";
				valoreInserito = true;
			}
			if(campiCompilati.get(2).length() != 0)
			{
				query += (valoreInserito == true ? " AND " : " WHERE ") 
						+ "titolo like '%" + campiCompilati.get(2) + "%'";
				valoreInserito = true;
			}
			if(campiCompilati.get(3).length() != 0)
			{
				query += (valoreInserito == true ? " AND " : " WHERE ") 
						+ "autori like '%" + campiCompilati.get(3) + "%'";
				valoreInserito = true;
			}
			if(campiCompilati.get(4).length() != 0)
			{
				query += (valoreInserito == true ? " AND " : " WHERE ") 
						+ "autori like '%" + campiCompilati.get(4) + "%'";
				valoreInserito = true;
			}
			if(campiCompilati.get(5).length() != 0)
			{
				query += (valoreInserito == true ? " AND " : " WHERE ") 
						+ "nome_dipartimento = '" + campiCompilati.get(5) 
						+ "'";
				valoreInserito = true;
			}
			if(campiCompilati.get(6).length() != 0)
			{
				query += (valoreInserito == true ? " AND " : " WHERE ") 
						+ "nome_area_scientifica = '" + campiCompilati.get(6) 
						+ "'";
				valoreInserito = true;
			}

			System.out.println(query);
			Statement st = (Statement) con.createStatement();

			ResultSet rs = st.executeQuery(query);

			while(rs.next())
			{
				prod = new Prodotto(Integer.parseInt(
						rs.getString(DBNames.PROD_ID)), 
						rs.getString(DBNames.PROD_TIT),
						rs.getString(DBNames.PROD_STATO),
						rs.getString(DBNames.PROD_COD),
						rs.getString(DBNames.PROD_PUBB),
						rs.getString(DBNames.PROD_LING),
						rs.getString(DBNames.PROD_ANNO_PUBB),
						rs.getInt(DBNames.PROD_PROPR),
						rs.getString(DBNames.PROD_URL),
						rs.getString(DBNames.PROD_ABSTRACT),
						rs.getString(DBNames.PROD_AUTORI),
						rs.getString(DBNames.PROD_TIP));
				System.out.println("id: "+prod.getId_prodotto() 
						+ " pubblico: " + prod.getPubblico());
				listaProdotti.add(prod);
			}

			System.out.println("List_Product created" );

			st.close();
			rs.close();
			DBConnectionPool.releaseConnection(con);
		} catch (SQLException e) {
			e.printStackTrace();
		}

		return listaProdotti;
	}
	

	/**
	 * Is used to search for a Product specifying its ID 
	 * 
	 * @param id_Prodotto - The Product's Id 
	 * 
	 *  @return Return An Array Containing the Product found 
	 * 
	 */
	public ArrayList<Prodotto> getProdottoByIdProdotto(int id) {
		int prod_id=id;
		
		//Istanzia un oggetto prodotto
		Prodotto prod = null;
				
		//Istanzia un ArrayList di Prodotti
		ArrayList<Prodotto> listaProdotti = new ArrayList<Prodotto>();
		
		try {
			//Crea una connessione al DB
			Connection con = DBConnectionPool.getConnection();

			//Crea la query di ricerca
			String query = "SELECT Prodotto.id_prodotto,titolo,stato,codice,"
					+ "pubblico,lingua,anno_pubblicazione,"
					+ "proprietario,url,tipologia,"
					+ "abstract,autori,isbn,casa_editrice,"
					+ "P1.pagine_da_a,"
					+ "capitoli,codice_ance,nome_rivista,"
					+ "P2.pagine_da_a AS pagine_riv,"
					+ "volume,argomento,conferenza,luogo,data "
					+ "FROM Prodotto LEFT JOIN articolo_libro P1 ON Prodotto"
					+ ".id_prodotto = P1.id_prodotto "
					+ "LEFT JOIN articolo_rivista P2 ON Prodotto.id_prodotto ="
					+ " P2.id_prodotto "
					+ "LEFT JOIN monografia P3 ON Prodotto.id_prodotto ="
					+ " P3.id_prodotto "
					+ "LEFT JOIN proceeding P4 ON Prodotto.id_prodotto ="
					+ " P4.id_prodotto "
					+ "WHERE Prodotto.id_prodotto = " + prod_id+""; 
			
			System.out.println(query);
			Statement st = (Statement) con.createStatement();

			ResultSet rs = st.executeQuery(query);

			while(rs.next())
			{
				if(rs.getString(DBNames.PROD_TIP).equals("articolo_libro")) {
					prod = new ArticoloLibro(Integer.parseInt(
							rs.getString(DBNames.PROD_ID)), 
							rs.getString(DBNames.PROD_TIT),
							rs.getString(DBNames.PROD_STATO),
							rs.getString(DBNames.PROD_COD),
							rs.getString(DBNames.PROD_PUBB),
							rs.getString(DBNames.PROD_LING),
							rs.getString(DBNames.PROD_ANNO_PUBB),
							rs.getInt(DBNames.PROD_PROPR),
							rs.getString(DBNames.PROD_URL),
							rs.getString(DBNames.PROD_ABSTRACT),
							rs.getString(DBNames.PROD_AUTORI),
							rs.getString(DBNames.PROD_TIP),
							rs.getString(DBNames.PROD_ISBN),
							rs.getString(DBNames.PROD_CASA_ED),
							rs.getString(DBNames.PROD_PAG_D_A),
							rs.getString(DBNames.PROD_CAP_DA_A));
				}
				
				else if(rs.getString(DBNames.PROD_TIP)
						.equals("articolo_rivista")) {
					prod = new ArticoloRivista(Integer.parseInt(
							rs.getString(DBNames.PROD_ID)), 
							rs.getString(DBNames.PROD_TIT),
							rs.getString(DBNames.PROD_STATO),
							rs.getString(DBNames.PROD_COD),
							rs.getString(DBNames.PROD_PUBB),
							rs.getString(DBNames.PROD_LING),
							rs.getString(DBNames.PROD_ANNO_PUBB),
							rs.getInt(DBNames.PROD_PROPR),
							rs.getString(DBNames.PROD_URL),
							rs.getString(DBNames.PROD_ABSTRACT),
							rs.getString(DBNames.PROD_AUTORI),
							rs.getString(DBNames.PROD_TIP),
							rs.getString(DBNames.PROD_ANCE),
							rs.getString(DBNames.PROD_RIVIS_NOME),
							rs.getString("pagine_riv"));
				}
				
				else if(rs.getString(DBNames.PROD_TIP).equals("monografia")) {
					prod = new Monografia(Integer.parseInt(
							rs.getString(DBNames.PROD_ID)), 
							rs.getString(DBNames.PROD_TIT),
							rs.getString(DBNames.PROD_STATO),
							rs.getString(DBNames.PROD_COD),
							rs.getString(DBNames.PROD_PUBB),
							rs.getString(DBNames.PROD_LING),
							rs.getString(DBNames.PROD_ANNO_PUBB),
							rs.getInt(DBNames.PROD_PROPR),
							rs.getString(DBNames.PROD_URL),
							rs.getString(DBNames.PROD_ABSTRACT),
							rs.getString(DBNames.PROD_AUTORI),
							rs.getString(DBNames.PROD_TIP), 
							Integer.parseInt(rs.getString(DBNames.PROD_VOLUM)), 
							rs.getString(DBNames.PROD_ARGOMENTO));
				}
				
				else if(rs.getString(DBNames.PROD_TIP).equals("proceeding")) {
					prod = new Proceeding(Integer.parseInt(
							rs.getString(DBNames.PROD_ID)), 
							rs.getString(DBNames.PROD_TIT),
							rs.getString(DBNames.PROD_STATO),
							rs.getString(DBNames.PROD_COD),
							rs.getString(DBNames.PROD_PUBB),
							rs.getString(DBNames.PROD_LING),
							rs.getString(DBNames.PROD_ANNO_PUBB),
							rs.getInt(DBNames.PROD_PROPR),
							rs.getString(DBNames.PROD_URL),
							rs.getString(DBNames.PROD_ABSTRACT),
							rs.getString(DBNames.PROD_AUTORI),
							rs.getString(DBNames.PROD_TIP), 
							rs.getString(DBNames.PROD_CONFER),
							rs.getString(DBNames.PROD_CONFER_LUOG),
							rs.getDate(DBNames.PROD_CONFER_DATA));
				}
				
				else {
					prod = new Prodotto(Integer.parseInt(
							rs.getString(DBNames.PROD_ID)), 
							rs.getString(DBNames.PROD_TIT),
							rs.getString(DBNames.PROD_STATO),
							rs.getString(DBNames.PROD_COD),
							rs.getString(DBNames.PROD_PUBB),
							rs.getString(DBNames.PROD_LING),
							rs.getString(DBNames.PROD_ANNO_PUBB),
							rs.getInt(DBNames.PROD_PROPR),
							rs.getString(DBNames.PROD_URL),
							rs.getString(DBNames.PROD_ABSTRACT),
							rs.getString(DBNames.PROD_AUTORI),
							rs.getString(DBNames.PROD_TIP));
				}
				
				listaProdotti.add(prod);
			}

//			System.out.println("List_Product created" );
			
			st.close();
			rs.close();
			DBConnectionPool.releaseConnection(con);
			} catch (SQLException e) {
			e.printStackTrace();
		}

		return listaProdotti;
		
	}
	
	/**
	 * Is Used to store a Product in the System
	 * 
	 * @param prod - Product 
	 * 
	 *  @return The Product's Id 
	 * 
	 */
	public int inserisciProdotto(Prodotto prod) {
		
		int prod_id = 0;
		
		try {
        	//Crea una connessione al DB
        	Connection con = DBConnectionPool.getConnection();

            //Create la query di inserimento
            String query = "INSERT INTO Prodotto "
            		+ "VALUES (?,?,?,?,?,?,?,?,?,?,?,?)";
            
            PreparedStatement st = con.prepareStatement(query);
            
            st.setInt(1, 0);
            st.setString(2, prod.getTitolo());
            st.setString(3, prod.getStato());
            st.setString(4, prod.getCodice());
            st.setString(5, prod.getPubblico());
            st.setString(6, prod.getLingua());
            st.setString(7, prod.getAnno_pubblicazione());
            st.setInt(8, prod.getProprietario());
            st.setString(9, prod.getUrl());
            st.setString(10, prod.getTipologia());
            st.setString(11, prod.getPr_abstract());
            st.setString(12, prod.getAutori());
            
            st.executeUpdate();
            con.commit();
            
            query = "SELECT id_prodotto FROM Prodotto WHERE titolo = '" 
            		+ prod.getTitolo() + "' AND proprietario = '" 
            		+ prod.getProprietario() + "'";
            
            Statement stmt = (Statement) con.createStatement();
            ResultSet rs = stmt.executeQuery(query);
            rs.next();
            
            String idProd = rs.getString(DBNames.PROD_ID);
            prod_id = Integer.parseInt(idProd);
            
            rs.close();
            st.close();
            stmt.close();
            DBConnectionPool.releaseConnection(con);
        } catch (SQLException e) {
        	e.printStackTrace();
        }
		
		return prod_id;
		
	}
	
	/**
	 * Is Used To store an Article in a book in the system
	 * 
	 * @param artLib - The Article in a book 
	 * 
	 */
	public void inserisciArticoloLibro(ArticoloLibro artLib) {
		try {
        	//Crea una connessione al DB
        	Connection con = DBConnectionPool.getConnection();

            //Create la query di inserimento
            String query = "INSERT INTO articolo_libro VALUES (?,?,?,?,?)";
            
            PreparedStatement st = con.prepareStatement(query);
            
            st.setInt(1, artLib.getId_prodotto());
            st.setString(2, artLib.getIsbn());
            st.setString(3, artLib.getCasa_editrice());
            st.setString(4, artLib.getPagine_da_a());
            st.setString(5, artLib.getCapitoli_da_a());
            
            st.executeUpdate();
            con.commit();
            
            st.close();
            DBConnectionPool.releaseConnection(con);
        } catch (SQLException e) {
        	e.printStackTrace();
        }
	}
	
	/**
	 * Is used to insert a magazine article in the system
	 * 
	 * @param artRiv - The magazine article
	 * 
	 */
	public void inserisciArticoloRivista(ArticoloRivista artRiv) {
		try {
        	//Crea una connessione al DB
        	Connection con = DBConnectionPool.getConnection();

            //Create la query di inserimento
            String query = "INSERT INTO articolo_rivista VALUES (?,?,?,?)";
            
            PreparedStatement st = con.prepareStatement(query);
            
            st.setInt(1, artRiv.getId_prodotto());
            st.setString(2, artRiv.getCodice_ance());
            st.setString(3, artRiv.getNome_rivista());
            st.setString(4, artRiv.getPagine_da_a());
            
            st.executeUpdate();
            con.commit();
            
            st.close();
            DBConnectionPool.releaseConnection(con);
        } catch (SQLException e) {
        	e.printStackTrace();
        }
	}
	
	/**
	 * Is used to store a monograph in the system
	 * 
	 * @param monograf - The monograph 
	 * 
	 */
	public void inserisciMonografia(Monografia monograf) {
		try {
        	//Crea una connessione al DB
        	Connection con = DBConnectionPool.getConnection();

            //Create la query di inserimento
            String query = "INSERT INTO monografia VALUES (?,?,?)";
            
            PreparedStatement st = con.prepareStatement(query);
            
            st.setInt(1, monograf.getId_prodotto());
            st.setInt(2, monograf.getVolume());
            st.setString(3, monograf.getArgomento());
            
            st.executeUpdate();
            con.commit();
            
            st.close();
            DBConnectionPool.releaseConnection(con);
        } catch (SQLException e) {
        	e.printStackTrace();
        }
	}
	
	/**
	 * Is used to store a proceeding in our system
	 * 
	 * @param proceed - The proceeding 
	 * 
	 */
	public void inserisciProceeding(Proceeding proceed) {
		try {
        	//Crea una connessione al DB
        	Connection con = DBConnectionPool.getConnection();

            //Create la query di inserimento
            String query = "INSERT INTO proceeding VALUES (?,?,?,?)";
            
            PreparedStatement st = con.prepareStatement(query);
            
            st.setInt(1, proceed.getId_prodotto());
            st.setString(2, proceed.getConferenza());
            st.setString(3, proceed.getLuogo());
            st.setDate(4, proceed.getData());
            
            st.executeUpdate();
            con.commit();
            
            st.close();
            DBConnectionPool.releaseConnection(con);
        } catch (SQLException e) {
        	e.printStackTrace();
        }
	}
	
	/**
	 * Is used to store a patent in our system
	 * 
	 * @param brev - The patent
	 * 
	 */
	public void inserisciBrevetto(Brevetto brev) {
		try {
        	//Crea una connessione al DB
        	Connection con = DBConnectionPool.getConnection();

            //Create la query di inserimento
            String query = "INSERT INTO brevetto VALUES (?)";
            
            PreparedStatement st = con.prepareStatement(query);
            
            st.setInt(1, brev.getId_prodotto());
            
            st.executeUpdate();
            con.commit();
            
            st.close();
            DBConnectionPool.releaseConnection(con);
        } catch (SQLException e) {
        	e.printStackTrace();
        }
	}
	
	/**
	 * Is used to store a "Curatela"
	 * 
	 * @param curat - The Curatela
	 * 
	 */
	public void inserisciCuratela(Curatela curat) {
		try {
        	//Crea una connessione al DB
        	Connection con = DBConnectionPool.getConnection();

            //Create la query di inserimento
            String query = "INSERT INTO curatela VALUES (?)";
            
            PreparedStatement st = con.prepareStatement(query);
            
            st.setInt(1, curat.getId_prodotto());
            
            st.executeUpdate();
            con.commit();
            
            st.close();
            DBConnectionPool.releaseConnection(con);
        } catch (SQLException e) {
        	e.printStackTrace();
        }
	}
	
	/**
	 * Is used to store a generic Product 
	 * 
	 * @param altro - The product 
	 * 
	 */
	public void inserisciAltroProdotto(AltroProdotto altro) {
		try {
        	//Crea una connessione al DB
        	Connection con = DBConnectionPool.getConnection();

            //Create la query di inserimento
            String query = "INSERT INTO altro VALUES (?)";
            
            PreparedStatement st = con.prepareStatement(query);
            
            st.setInt(1, altro.getId_prodotto());
            
            st.executeUpdate();
            con.commit();
            
            st.close();
            DBConnectionPool.releaseConnection(con);
        } catch (SQLException e) {
        	e.printStackTrace();
        }
	}
	

	/**
	 * Is used to remove a product from our System
	 * 
	 * @param prod  - The product 
	 * 
	 */
	public void eliminaProdotto(Prodotto prod) {
		try {
			//Crea una connessione al DB
			Connection con = DBConnectionPool.getConnection();
			
			int id = prod.getId_prodotto();

			String query="DELETE FROM Prodotto WHERE id_prodotto = ?";
			
			PreparedStatement st = con.prepareStatement(query);
            
            st.setInt(1, id);
            
            st.executeUpdate();
			con.commit();
			
			st.close();
			DBConnectionPool.releaseConnection(con);
		} catch (SQLException e) {
			e.printStackTrace();
		}
	}
	
	/**
	 * Is used to modify a specific product 
	 * 
	 * @param prod - The product 
	 * @param oldTipologia - The old Product's Kind
	 * 
	 */
	public void modificaProdotto(Prodotto prod, String oldTipologia) {
		try {
			//Crea una connessione al DB
			Connection con = DBConnectionPool.getConnection();
			
			int id = prod.getId_prodotto();
			String tipologia = prod.getTipologia();

			String query="UPDATE Prodotto SET titolo = ?,stato = ?,codice = ?,"
					+ "pubblico = ?,lingua = ?,anno_pubblicazione = ?,url = ?,"
					+ "tipologia = ?,abstract = ?,autori = ? "
					+ "WHERE id_prodotto = ?";
			
			PreparedStatement st = con.prepareStatement(query);
			
			st.setString(1, prod.getTitolo());
			st.setString(2, prod.getStato());
			st.setString(3, prod.getCodice());
			st.setString(4, prod.getPubblico());
			st.setString(5, prod.getLingua());
			st.setString(6, prod.getAnno_pubblicazione());
			st.setString(7, prod.getUrl());
			st.setString(8, tipologia);
			st.setString(9, prod.getPr_abstract());
			st.setString(10, prod.getAutori());
			st.setInt(11, id);
			
			st.executeUpdate();
			con.commit();
			
			if(tipologia.equals("articolo_libro")) {
				
				ArticoloLibro artLib = (ArticoloLibro) prod;
				
				if(!tipologia.equals(oldTipologia)) {
					query="DELETE FROM " + oldTipologia 
							+ " WHERE id_prodotto = ?";
					st = con.prepareStatement(query);
		            st.setInt(1, id);
		            st.executeUpdate();
					con.commit();
					
					query="INSERT INTO articolo_libro VALUES (?,?,?,?,?)";
					st = con.prepareStatement(query);
		            
		            st.setInt(1, artLib.getId_prodotto());
		            st.setString(2, artLib.getIsbn());
		            st.setString(3, artLib.getCasa_editrice());
		            st.setString(4, artLib.getPagine_da_a());
		            st.setString(5, artLib.getCapitoli_da_a());
		            
		            st.executeUpdate();
		            con.commit();
				}
				else {
					query="UPDATE Articolo_libro SET isbn = ?,"
							+ "casa_editrice = ?,pagine_da_a = ?,capitoli = ? "
							+ "WHERE id_prodotto = ?";
					
					st = con.prepareStatement(query);
					
					st.setString(1, artLib.getIsbn());
					st.setString(2, artLib.getCasa_editrice());
					st.setString(3, artLib.getPagine_da_a());
					st.setString(4, artLib.getCapitoli_da_a());
					st.setInt(5, id);
					
					st.executeUpdate();
					con.commit();
				}
				
			}
			else if(tipologia.equals("articolo_rivista")) {
				
				ArticoloRivista artRiv = (ArticoloRivista) prod;
				
				if(!tipologia.equals(oldTipologia)) {
					query="DELETE FROM " + oldTipologia 
							+ " WHERE id_prodotto = ?";
					st = con.prepareStatement(query);
		            st.setInt(1, id);
		            st.executeUpdate();
					con.commit();
					
					query="INSERT INTO articolo_rivista VALUES (?,?,?,?)";
					st = con.prepareStatement(query);
		            
		            st.setInt(1, artRiv.getId_prodotto());
		            st.setString(2, artRiv.getCodice_ance());
		            st.setString(3, artRiv.getNome_rivista());
		            st.setString(4, artRiv.getPagine_da_a());
		            
		            st.executeUpdate();
		            con.commit();
				}
				else {
					query="UPDATE Articolo_rivista SET codice_ance = ?,"
							+ "nome_rivista = ?,pagine_da_a = ? "
							+ "WHERE id_prodotto = ?";
					
					st = con.prepareStatement(query);
					
					st.setString(1, artRiv.getCodice_ance());
					st.setString(2, artRiv.getNome_rivista());
					st.setString(3, artRiv.getPagine_da_a());
					st.setInt(4, id);
					
					st.executeUpdate();
					con.commit();
				}
			}
			else if(tipologia.equals("monografia")) {
				
				Monografia monog = (Monografia) prod;
				
				if(!tipologia.equals(oldTipologia)) {
					query="DELETE FROM " + oldTipologia 
							+ " WHERE id_prodotto = ?";
					st = con.prepareStatement(query);
		            st.setInt(1, id);
		            st.executeUpdate();
					con.commit();
					
					query="INSERT INTO monografia VALUES (?,?,?)";
					st = con.prepareStatement(query);
		            
		            st.setInt(1, monog.getId_prodotto());
		            st.setInt(2, monog.getVolume());
		            st.setString(3, monog.getArgomento());
		            
		            st.executeUpdate();
		            con.commit();
				}
				else {
					query="UPDATE Monografia SET volume = ?,argomento = ? "
							+ "WHERE id_prodotto = ?";
					
					st = con.prepareStatement(query);
					
					st.setInt(1, monog.getVolume());
					st.setString(2, monog.getArgomento());
					st.setInt(3, id);
					
					st.executeUpdate();
					con.commit();
				}
			}
			else if(tipologia.equals("proceeding")) {
				
				Proceeding proc = (Proceeding) prod;
				
				if(!tipologia.equals(oldTipologia)) {
					query="DELETE FROM " + oldTipologia 
							+ " WHERE id_prodotto = ?";
					st = con.prepareStatement(query);
		            st.setInt(1, id);
		            st.executeUpdate();
					con.commit();
					
					query="INSERT INTO proceeding VALUES (?,?,?,?)";
					st = con.prepareStatement(query);
		            
		            st.setInt(1, proc.getId_prodotto());
		            st.setString(2, proc.getConferenza());
		            st.setString(3, proc.getLuogo());
		            st.setDate(4, proc.getData());
		            
		            st.executeUpdate();
		            con.commit();
				}
				else {
					query="UPDATE Proceeding SET conferenza = ?,luogo = ?,"
							+ "data = ? WHERE id_prodotto = ?";
					
					st = con.prepareStatement(query);
					
					st.setString(1, proc.getConferenza());
					st.setString(2, proc.getLuogo());
					st.setDate(3, proc.getData());
					st.setInt(4, id);
					
					st.executeUpdate();
					con.commit();
				}
			}
			else if(tipologia.equals("brevetto")) {
				
				Brevetto brev = (Brevetto) prod;
				
				if(!tipologia.equals(oldTipologia)) {
					query="DELETE FROM " + oldTipologia 
							+ " WHERE id_prodotto = ?";
					st = con.prepareStatement(query);
		            st.setInt(1, id);
		            st.executeUpdate();
					con.commit();
					
					query="INSERT INTO brevetto VALUES (?)";
					st = con.prepareStatement(query);
		            
		            st.setInt(1, brev.getId_prodotto());
		            
		            st.executeUpdate();
		            con.commit();
				}
			}
			else if(tipologia.equals("curatela")) {
				
				Curatela curat = (Curatela) prod;
				
				if(!tipologia.equals(oldTipologia)) {
					query="DELETE FROM " + oldTipologia 
							+ " WHERE id_prodotto = ?";
					st = con.prepareStatement(query);
		            st.setInt(1, id);
		            st.executeUpdate();
					con.commit();
					
					query="INSERT INTO curatela VALUES (?)";
					st = con.prepareStatement(query);
		            
		            st.setInt(1, curat.getId_prodotto());
		            
		            st.executeUpdate();
		            con.commit();
				}
			}
			else if(tipologia.equals("altro")) {
				
				AltroProdotto altro = (AltroProdotto) prod;
				
				if(!tipologia.equals(oldTipologia)) {
					query="DELETE FROM " + oldTipologia 
							+ " WHERE id_prodotto = ?";
					st = con.prepareStatement(query);
		            st.setInt(1, id);
		            st.executeUpdate();
					con.commit();
					
					query="INSERT INTO altro VALUES (?)";
					st = con.prepareStatement(query);
		            
		            st.setInt(1, altro.getId_prodotto());
		            
		            st.executeUpdate();
		            con.commit();
				}
			}
			
			st.close();
			DBConnectionPool.releaseConnection(con);
		} catch (SQLException e) {
			e.printStackTrace();
		}
	}
	
	/**
	 * Is used To store a notification in our System
	 * 
	 * @param notif - The notification
	 * 
	 */
	public void inserisciNotifica(Notifica notif) {
		try {
			//Crea una connessione al DB
			Connection con = DBConnectionPool.getConnection();

			String query="INSERT INTO notifica VALUES (?,?,?,?,?,?)";
			
			PreparedStatement st = con.prepareStatement(query);
            
            st.setInt(1, 0);
            st.setDate(2, notif.getData());
			st.setInt(3, notif.getId_mittente());
			st.setInt(4, notif.getId_destinatario());
			st.setInt(5, notif.getId_prodotto());
			st.setString(6, notif.getStato());
            
            st.executeUpdate();
			con.commit();
			
			st.close();
			DBConnectionPool.releaseConnection(con);
		} catch (SQLException e) {
			e.printStackTrace();
		}
	}
	
	
	/**
	 * Is used To check if a researcher has just received the notification,
	 * to avoid duplicate notifications on the same product
	 * 
	 * @param id_prodotto - the product id
	 * @param id_account - the account id
	 * @return true if the notifications exists, false if not
	 */
	public boolean notificaAttiva(int id_prodotto, int id_account) {
		
		int numNotifiche = 0;
		
		try {
			//Crea una connessione al DB
			Connection con = DBConnectionPool.getConnection();

			String query="SELECT COUNT(*) as NumNotifiche FROM Notifica "
					+ "WHERE destinatario = " + id_account 
					+ " AND prodotto = " + id_prodotto
					+ " AND stato = 'attiva'";
			
			Statement st = (Statement) con.createStatement();

			ResultSet rs = st.executeQuery(query);
			
			if(rs.next()) numNotifiche = rs.getInt("NumNotifiche");
            
            rs.close();
			st.close();
			DBConnectionPool.releaseConnection(con);
		} catch (SQLException e) {
			e.printStackTrace();
		}
		
		if(numNotifiche != 0) return true;
		
		return false;
	}
	
	
	/**
	 * Is used to search for all products which are waiting for a recognition 
	 * 
	 * @param id_account - The Account's Id 
	 * 
	 * @return The list of all products that are waiting a recognition 
	 * 
	 */
	public ArrayList<Prodotto> getProdottiDaRiconoscere(int id_account) {
		
		//Istanzia un oggetto prodotto
		Prodotto prod = null;
				
		//Istanzia un ArrayList di Prodotti
		ArrayList<Prodotto> listaProdottiDaRiconoscere = 
				new ArrayList<Prodotto>();
				
		try {
			//Crea una connessione al DB
			Connection con = DBConnectionPool.getConnection();
			
			//Crea la query di ricerca
			String query = "SELECT * "
					+ "FROM Prodotto JOIN Notifica ON Prodotto.id_prodotto = "
					+ "Notifica.prodotto WHERE Notifica.destinatario = '" 
					+ id_account + "' AND Notifica.stato = 'attiva'";
			
			Statement st = (Statement) con.createStatement();

			ResultSet rs = st.executeQuery(query);

			while(rs.next())
			{
				prod = new Prodotto(Integer.parseInt(
						rs.getString(DBNames.PROD_ID)), 
						rs.getString(DBNames.PROD_TIT),
						rs.getString(DBNames.PROD_STATO),
						rs.getString(DBNames.PROD_COD),
						rs.getString(DBNames.PROD_PUBB),
						rs.getString(DBNames.PROD_LING),
						rs.getString(DBNames.PROD_ANNO_PUBB),
						rs.getInt(DBNames.PROD_PROPR),
						rs.getString(DBNames.PROD_URL),
						rs.getString(DBNames.PROD_ABSTRACT),
						rs.getString(DBNames.PROD_AUTORI),
						rs.getString(DBNames.PROD_TIP));
				
				listaProdottiDaRiconoscere.add(prod);
			}

			System.out.println("listaProdottiDaRiconoscere creata" );

			st.close();
			rs.close();
			DBConnectionPool.releaseConnection(con);
		} catch (SQLException e) {
			e.printStackTrace();
		}
		
		return listaProdottiDaRiconoscere;
	}
	
	/**
	 * It's used to confirm a cooperation on a product 
	 * 
	 * @param id_account - The account's id 
	 * @param id_prodotto - The product's id 
	 * 
	 */
	public void confermaRiconoscimento(int id_account, int id_prodotto) {
		try {
			//Crea una connessione al DB
			Connection con = DBConnectionPool.getConnection();
			String autori = "";
			
			//Disattiva la notifica a seguito del riconoscimento da parte del ricercatore
			String query="UPDATE Notifica SET stato = 'disattiva' "
					+ "WHERE prodotto = ? AND destinatario = ?";
			
			PreparedStatement st = con.prepareStatement(query);
            st.setInt(1, id_prodotto);
            st.setInt(2, id_account);
            st.executeUpdate();
			con.commit();
			
			//Estrae la stringa degli autori dal prodotto corrispondente
			query = "SELECT autori FROM Prodotto WHERE id_prodotto = ?";
			
			st = con.prepareStatement(query);
			st.setInt(1, id_prodotto);
			ResultSet rs = st.executeQuery();
			if(rs.next()) {
				autori += rs.getString(DBNames.PROD_AUTORI);
			}
			
			//Aggiunge nome e cognome dell'autore che ha effettuato il riconoscimento alla lista degli autori di quel prodotto
			query = "SELECT nome, cognome FROM Ricercatore "
					+ "WHERE id_account = ?";
			
			st = con.prepareStatement(query);
            st.setInt(1, id_account);
            rs = st.executeQuery();
            if(rs.next()) {
            	autori += ", " + rs.getString(DBNames.RICER_NOME) + " " 
            			+ rs.getString(DBNames.RICER_COGN);
            	System.out.println(autori);
            }
            
            query = "UPDATE Prodotto SET autori = ? WHERE id_prodotto = ?";
            
            st = con.prepareStatement(query);
            st.setString(1, autori);
            st.setInt(2, id_prodotto);
            st.executeUpdate();
			con.commit();
			
			//Aggiunge id_account e id_prodotto nella tabella Collaborazione
			query = "INSERT INTO Collaborazione VALUES(?,?)";
			
			st = con.prepareStatement(query);
			st.setInt(1, id_account);
			st.setInt(2, id_prodotto);
			st.executeUpdate();
			con.commit();
			
			rs.close();
			st.close();
			DBConnectionPool.releaseConnection(con);
		} catch (SQLException e) {
			e.printStackTrace();
		}
	}
	
	/**
	 * This method is used to reports the notifications
	 * 
	 * @param id_account - The account's id
	 * 
	 *  @return The notification's id 
	 * 
	 */
	public int segnalaNotifica(int id_account) {
		
		int numNotifiche = 0;
		
		try {
			//Crea una connessione al DB
			Connection con = DBConnectionPool.getConnection();

			String query="SELECT COUNT(*) as NumNotifiche FROM Notifica "
					+ "WHERE destinatario = " + id_account 
					+ " AND stato = 'attiva'";
			
			Statement st = (Statement) con.createStatement();

			ResultSet rs = st.executeQuery(query);
			
			if(rs.next()) numNotifiche = rs.getInt("NumNotifiche");
            
            rs.close();
			st.close();
			DBConnectionPool.releaseConnection(con);
		} catch (SQLException e) {
			e.printStackTrace();
		}
		
		return numNotifiche;
	}
	
	/**
	 * It's used to verify if an User is inserting a product already inserted in the system
	 * 
	 * @param prod - The Product
	 * 
	 *  @return 0 if the product doesn't exist yet, 1 if the product already exists 
	 * 
	 */
	public int findDuplicate(Prodotto prod) {
		int numDuplicati = 0;
		
		try{
			Connection con = DBConnectionPool.getConnection();

			String query="SELECT COUNT(*) as NumDuplicati FROM prodotto "
					+ "WHERE titolo LIKE '%"+prod.getTitolo()+"%' AND ("
					+ "codice = '"+prod.getCodice()
					+"' OR anno_pubblicazione = '"
					+prod.getAnno_pubblicazione()
					+"' OR tipologia = '"
					+prod.getTipologia()+"')";
			
			System.out.println("query : " +query);
			
			Statement st = (Statement) con.createStatement();
			
			ResultSet rs = st.executeQuery(query);
			
			if(rs.next()) numDuplicati = rs.getInt("NumDuplicati"); 
			
			rs.close();
			st.close();
			DBConnectionPool.releaseConnection(con);
			
		}catch (SQLException e) {
			e.printStackTrace();
		}
		
		return numDuplicati;
	}
	
	
	
}







